package abstract_interface_0915;

/**
 * 抽象类：
 * 抽象类是普通类的超集。
 * 普通类有的抽象类全都有，普通类中的普通方法，构造方法，抽象类中全都可以存在，换句话说抽象类就是比普通类多了一些抽象方法
 * 在JAVA中使用abstract关键字定义抽象方法，且抽方法所在类一定是个抽象类，抽象方法没有方法体
 * 没有方法体的一定是抽象方法，抽象方法一定没有方法体是错误的
 * native方法没有方法体，只有方法声明
 * 抽象类也是使用abstract关键字声明可以包含【0...N】种抽象方
 * 抽象类无法直接实例化子类，子类继承抽象类必须覆写所有抽象类中的抽象方法
 *
 * 抽象类的使用原则：
 * 1.抽象类无法直接实例化对象，可以通过子类的向上转型
 * 2.子类（普通类）继承抽象类必须覆写所有的抽象方法（子类仍是个抽象类，就可以不用覆写抽象任何方法）
 * 3.abstract不能和final关键字一起出现，也不能private abstract一起出现
 * 4.抽象类是普通类的超集，抽象类中仍然可以存在普通方法和构造方法
 * （子类仍满足对象实例化的流程，先调用父类的构造方法，再调用子类的构造方法）
 *
 * 抽象类和抽象方法存在的意义：
 * 就在于强制要求子类重写某些方法，但是抽象类仍然满足is a原则，抽象类必须是满足继承关系才能继承抽象类，且一个子类只能继承一个抽象类（单继承局限）
 *现阶段：
 * 抽象类的使用和设计是一个比较复杂的情况。
 * 抽象类一般是一个模板的存在，模板设计模板就是基于抽象类的设计，JAVA中的servlet就是抽象类的使用
 *
 */
public abstract class Shape {

    public abstract void draw();
    //JYM其实是使用c++实现的，JAVA允许通过特定的方式来调用c++的方法，这些方法就属于本地方法
//    public native int hashCode();//hashCode()方法体c++实现的，JAVA只负责调用而已
}
